package x.ovo.wechat.bot.common.contact;

import x.ovo.wechat.bot.common.entity.Contact;

import java.util.Iterator;

/**
 * 检索策略
 *
 * @author ovo, created by 2024/04/22
 */
public abstract class RetrievalStratrgy {

    /**
     * 构造函数，用于在对象创建时将其类型和实例映射到联系人管理器中。
     * 此构造函数会在对象实例化时自动将该对象的类型与实例映射到全局的联系人管理器中，以便于其他部分可以根据类型检索到具体的实例。
     */
    public RetrievalStratrgy() {
        ContactManager.STRATRGY_MAP.put(this.getType(), this);
    }

    /**
     * 根据指定的键值从迭代器中获取联系人。
     *
     * @param iterator 联系人迭代器，用于遍历联系人列表。
     * @param key 指定的联系人键值，用于查找特定的联系人。
     * @return 返回与键值对应的第一個 {@link Contact} 对象，如果没有找到则返回 null。
     */
    public abstract Contact getContact(Iterator<Contact> iterator, String key);

    /**
     * 根据键值移除联系人。
     *
     * @param key 需要移除的联系人的键值。
     * 该方法不提供返回值，但应根据键值从存储中移除对应的联系人。
     */
    public abstract void removeContact(String key);

    /**
     * 获取检索类型的抽象方法。
     *
     * @return RetrievalType 返回检索的类型。这是一个抽象方法，需要在具体实现类中进行定义。
     */
    public abstract RetrievalType getType();
}

